
var BaseApi = require('./baseApi').BaseApi;
var fs = require('fs');
var util = require("util");


exports.FileIOApi = (function() {
    function FileIOApi(mongoDB, keyValueStore, sessionStore)
    {
        this.mongoDB = mongoDB;


        this.keyValueStore = keyValueStore;
        this.sessionStore = sessionStore;
    }

    util.inherits(FileIOApi, BaseApi);

    FileIOApi.method('checkType',function(req,res) {
        var isImage = false;
        console.log('->> image.type.indexOf : ' + req.type.indexOf('image'));
        //파일의 타입 비교
        if(req.type.indexOf('image') > -1){
            console.log('->>> req.files.img is img');
            isImage = true;
        }else{
            console.log('->>> req.files.img is not img');
            isImage = false;
        }
        return isImage;
    });
    FileIOApi.method('renameImg', function(req,res) {


        var tmp_path = req.image.path;
        var target_path = './public/upload/' + (req.token + req.image.name);
        console.log('->> tmp_path: ' + tmp_path );
        console.log('->> target_path: ' + target_path );
        //tmp_path -> target_path로 이동하면서 파일명을 바꿉니다.
        fs.rename(tmp_path, target_path, function(err){
            if(err) throw err;
            /* 어떤 예제에서 아래와 같이 tmp_path를 다시 unlink해주지만 이미 rename으로 이동시켰기 때문에 tmp_path가 없다는 오류가 나게 됩니다.
             fs.unlink(tmp_path, function() {
             if (err) throw err;
             res.send('File uploaded to: ' + target_path + ' - ' + req.files.thumbnail.size + ' bytes');
             });*/
            console.log('->> upload done');
        });
    });


    FileIOApi.method('fileUpload',function(req,res)
    {
        var _self = this;

        require('crypto').randomBytes(12, function (ex, buf) {
            var token = buf.toString('hex');


            console.log('-> upload was called\n\n');
            console.log('-> ' + util.inspect(req.files));
            var images = [];
            var isImage = false;

            //express.bodyParser 는 multipart 를 위해 req.files를 만들어 줍니다.
            //클라이언트에서 mutiple로 요청시 여러파일이 올라오기 때문에 array인지 확인해 줍니다.
            if (Array.isArray(req.files.imgs)) {
                req.files.imgs.forEach(function (image) {
                    var kb = image.size / 1024 | 0;
                    //파일의 타입을 확인합니다.
                    isImage = _self.checkType(image);
                    image.token = token;
                    var imageWrap = {};
                    imageWrap.token = token;
                    imageWrap.image = image;
                    images.push({name: image.name, size: kb, isImage: isImage,  token: token});
                    //임시명으로 만들어진 파일의 이름을 바꿉니다.
                    _self.renameImg(imageWrap);
                    console.log('->> isImage: ' + isImage);
                });
            } else {
                if( req.files.imgs.name == "")
                {
                    res.send('empty');
                    return;
                }
                var image = req.files.imgs;
                var kb = image.size / 1024 | 0;
                isImage = _self.checkType(image);
                var imageWrap = {};
                imageWrap.token = token;
                imageWrap.image = image;
                images.push({name: image.name, size: kb, isImage: isImage, token: token});
                _self.renameImg(imageWrap);
                console.log('->> isImage: ' + isImage);
            }

            console.log('->> render');
            res.send( images);
        });

       /* var destinationFile = fs.createWriteStream("aws.png");
        req.pipe(destinationFile);

        var fileSize = req.headers['content-length'];
        var uploadedBytes = 0 ;

        req.on('data',function(d){

            uploadedBytes += d.length;
            var p = (uploadedBytes/fileSize) * 100;
            res.write("Uploading " + parseInt(p)+ " %\n");

        });

        req.on('end',function(){
            res.end("File Upload Complete");
        });*/

      /*  fs.readFile(req.files.uploadFie.path, function(error, data)
        {
           var filePath = __dirname + "\\files\\" + req.files.uploadFile.name;
            fs.writeFile(filePath, data, function(error)
            {
               if(error)
               {

               }
               else{
                   res.redirect("back");
               }
            });
        });*/
    });
    return FileIOApi;
})();